home *** CD-ROM | disk | FTP | other *** search
/ The ZX Files 3 / ZX Files 3 (Disk 2 of 3).adf / 48KMANUAL / 48PART2.txt / 48PART2.txt
Text File  |  1978-01-22  |  63KB  |  1,512 lines

  1.       CHAPTER 10
  2.       Mathematical functions
  3.       
  4.       Summary
  5.       
  6.            PI, EXP, LN, SIN, COS, TAN, ASN, ACS, ATN
  7.       
  8.         This chapter deals with the  mathematics that the ZX Spectrum 
  9.       can handle. Quite possibly you  will  never  have to use any of 
  10.       this at all, so  if  you  find  it   too  heavy going, don't be 
  11.       afraid of skipping it. It  covers  the operation  (raising to a 
  12.       power), the  functions  EXP  and  LN,  and  the trigonometrical 
  13.       functions SIN, COS, TAN and their inverses ASN, ACS, and ATN.
  14.       
  15.        ^ and EXP
  16.       
  17.         You can raise one number to the power of another - that means 
  18.       'multiply the first  number  by  itself  the  second  number of 
  19.       times'. This is normally  shown  by  writing  the second number 
  20.       just above and to the right  of the first number; but obviously 
  21.       this would be difficult  on  a  computer  so  we use the symbol 
  22.       instead. For example, the powers of 2 are
  23.       
  24.       21=2
  25.       22=2*2=4                (2 squared)
  26.       23=2*2*2=8              (2 cubed)
  27.       24=2*2*2*2=16           (2 to the power four)
  28.       
  29.         Thus at its most elementary  level,  'ab' means 'a multiplied 
  30.       by itself b times', but obviously this only makes sense if b is 
  31.       a positive whole number. To  find  a  definition that works for 
  32.       other values of b, we consider the rule
  33.       
  34.       a(b+c) = ab*ac
  35.       
  36.       (Notice that we give  a higher  priority  than  * and / so that 
  37.       when there are several operations in  one expression, the s are 
  38.       evaluated before the s  and  /s.  )  You  should  not need much 
  39.       convincing that this works when b and c are both positive whole 
  40.       numbers; but if we decide that we want it to work even when the
  41.       y are not, then we find ourselves compelled to accept that
  42.       
  43.       a0 = 1
  44.       a(-b) = 1/ab
  45.       a(1/b) = the bth root of  a,  which  is to say, the number that 
  46.       you have to multiply by itself b times to get a
  47.       
  48.       and
  49.       
  50.       a(b*c)=(ab)c
  51.       
  52.        If you have never seen any  of  this  before then don't try to 
  53.       remember it straight away; just remember that
  54.       
  55.       at (-1)=1/a
  56.       
  57.       and
  58.       
  59.       at (1/2)=SQR a
  60.       
  61.       and maybe when you are familiar  with these the rest will begin 
  62.       to make sense.
  63.       
  64.       
  65.         Experiment with all this by trying this program:
  66.       
  67.                       10 INPUT a,b,c
  68.                       20 PRINT a(b+c),ab*ac
  69.                       30 GO TO 14
  70.       
  71.         Of course, if the rule  we  gave  earlier  is true, then each 
  72.       time round the two numbers that the computer prints out will be 
  73.       equal. (Note - because of the way the computer works out t, the 
  74.       number on the left - a in this case - must never be negative.)
  75.       
  76.         A rather typical example of  what  this  function can be used 
  77.       for is that of compound interest. Suppose you keep some of your 
  78.       money in a building  society  and  they  give  15% interest per 
  79.       year. Then after one year you will  have not just the 100% that 
  80.       you had anyway, but  also  the  15%  interest that the building 
  81.       society have given you, making altogether  115% of what you had 
  82.       originally. To put it another way, you have multiplied your sum 
  83.       of money by 1.15, and this  is  true however much you had there 
  84.       in the first place.  After  another  year,  the  same will have 
  85.       happened again, so that  you  will then have 1.15*1.15=1.1512=1 
  86.       .3225 times your original  sum  of  money.  In general, after y 
  87.       years, you will have 1.15y times what you started out with.
  88.       
  89.         If you try this command
  90.       
  91.                       FOR y=0 TO 198: PRINT y,10*1.15Y: NEXT y
  92.       
  93.       you will see that  even  starting  off  from  just  ú10, it all 
  94.       mounts up quite quickly, and what  is  more, it gets faster and 
  95.       faster as time goes on. (Although even so, you might still find 
  96.       that it doesn't keep up with inflation.)
  97.       
  98.         This sort of behaviour, where after  a fixed interval of time 
  99.       some quantity  multiplies  itself  by  a  fixed  proportion, is 
  100.       called exponential growth, and it   is  calculated by raising a 
  101.       fixed number to the power of the time.
  102.       
  103.         Suppose you did this:
  104.       
  105.                       10 DEF FN a(x)=ax
  106.       
  107.         Here, a is more or less  fixed,  by LET statements: its value 
  108.       will correspond  to the interest rate, which changes only every 
  109.       so often.
  110.       
  111.         There is a certain value for  a  that makes the function FN a 
  112.       look especially  pretty to the  trained eye of a mathematician: 
  113.       and this value is  called  e.  The  ZX  Spectrum has a function 
  114.       called EXP defined by
  115.       
  116.                       EXP x=ex
  117.       
  118.         Unfortunately, e itself is  not  an especially pretty number: 
  119.       it is an infinite non-recurring decimal.  You can see its first 
  120.       few decimal places by doing
  121.       
  122.                       PRINT EXP 1
  123.       
  124.       because  EXP  1  =  e1  =  e.   Of  course,  this  is  just  an 
  125.       approximation. You can never write down e exactly.
  126.       
  127.       LN
  128.         The inverse  of  an  exponential  function  is  a logarithmic 
  129.       function: the logarithm (to base a) of  a number x is the power 
  130.       to which you have to raise  a  to  get  the number x, and it is 
  131.       written logax. Thus by definition alogax=x; and it is also true 
  132.       that log (ax)=x.
  133.       
  134.         You may well already know how  to  use base 10 logarithms for 
  135.       doing multiplications; these are  called common logarithms. The 
  136.       ZX Spectrum has a function  LN   which calculates logarithms to 
  137.       the base e; these are  called  natural logarithms. To calculate 
  138.       logarithms to any  other  base,  you  must  divide  the natural 
  139.       logarithm by the natural logarithm of the base:
  140.       
  141.               logax = LN x/ LN a
  142.       
  143.       PI
  144.         Given any circle, you  can  find  its perimeter (the distance 
  145.       round its edge; often called  its circumference) by multiplying 
  146.       its diameter (width) by a number called p. (p is a Greek p, and 
  147.       it is used because it stands for perimeter.
  148.        Its name is pi.)
  149.       
  150.         Like e, p is an infinite non-recurring decimal; it starts off 
  151.       as 3.141592653589....The  word  PI  on  the  Spectrum (extended 
  152.       mode, then M) is taken as standing  for this number - try PRINT 
  153.       PI.
  154.       
  155.       SIN, COS and TAN; ASN, ACS and ATN
  156.         The trigonometrical functions  measure  what  happens  when a 
  157.       point moves round  a circle. Here  is  a  circle of radius 1 (1 
  158.       what? It doesn't matter, as long  as  we  keep to the same unit 
  159.       all the way through. There is  nothing  to stop you inventing a 
  160.       new unit of your own  for  every  circle  that you happen to be 
  161.       interested in) and a point  moving  round it. The point started 
  162.       at the 3 o'clock position,  and  then  moved  round in an anti- 
  163.       clockwise direction.
  164.       
  165.       
  166.         We have also  drawn  in  two  lines  called  axes through the 
  167.       centre of the circle. The one  through  9 o'clock and 3 o'clock 
  168.       is called the x-axis,  and  the  one  through  6 o'clock and 12 
  169.       o'clock is called the y-axis.
  170.       
  171.         To specify where the point is,  you  say how far it has moved 
  172.       round the circle from its  3  o'clock starting position: let us 
  173.       call this distance a.  We  know  that  the circumference of the 
  174.       circle is 2p (because its radius is  1 and its diameter is thus 
  175.       2): so when it has moved a quarter of the way round the circle, 
  176.       a=p/2; when it has moved  halfway  round,  a=p; and when it has 
  177.       moved the whole way round, a=2p.
  178.       
  179.         Given the  curved  distance  round  the  edge,  a,  two other 
  180.       distances you might like to know  are  how  far the point is to 
  181.       the right of the y-axis, and  how  far  it is above the x-axis. 
  182.       These are called, respectively, the  cosine  and sine of a. The 
  183.       functions COS and SIN on the computer will calculate these.
  184.       
  185.       F9Vú/(PBrush0 0 341 3298BM8>(UI8Q;%rrl
  186.       
  187.       
  188.       
  189.         Note that if the point goes  to  the left of the y-axis, then 
  190.       the cosine becomes negative; and if the point goes below the x- 
  191.       axis, the sine becomes negative.
  192.       
  193.         Another property is that once a  has  got up to 2p, the point 
  194.       is back where it started and  the  sine and cosine start taking 
  195.       the same values all over again
  196.       :
  197.       
  198.                       SIN (a+2*PI) = SIN a
  199.               COS (a+2*PI) = COS a
  200.       
  201.         The tangent of a is  defined  to  be  the sine divided by the 
  202.       cosine; the corresponding function  on  the  computer is called 
  203.       TAN.
  204.       
  205.         Sometimes we need to  work  these  functions  out in reverse, 
  206.       finding the value  of a that has given sine, cosine or tangent. 
  207.       The functions  to  do  this  are  called  arcsine  (ASN  on the 
  208.       computer), arccosine (ACS) and arctangent (ATN).
  209.       
  210.         In the diagram of the point  moving round the circle, look at 
  211.       the radius joining the centre to  the point. You should be able 
  212.       to see that the distance  we  have  called a, the distance that 
  213.       the point has moved round the edge  of  the circle, is a way of 
  214.       measuring the angle through  which  the  radius  has moved away 
  215.       from the x-axis. When a=p/2, the  angle is 90 degrees; when a=p 
  216.       the angle is 180 degrees; and  so  round  to when a=2p, and the 
  217.       angle is 360  degrees.  You  might  just  as  well forget about 
  218.       degrees, and measure the angle in terms of a alone: we say then 
  219.       that we are measuring the angle in radians. Thus p/2 radians=
  220.       90 degrees and so on.
  221.       
  222.         You must always remember that on the ZX Spectrum SIN, COS and 
  223.       so on use  radians  and  not  degrees.  To  convert  degrees to 
  224.       radians, divide by 180 and multiply  by p; to convert back from 
  225.       radians to degrees, you divide by p and multiply by 180.
  226.       
  227.       
  228.       
  229.       CHAPTER 11
  230.       Random numbers
  231.       
  232.       Summary
  233.       
  234.            RANDOMIZE
  235.            RND
  236.       
  237.         This chapter deals  with  the  function  RND  and the keyword 
  238.       RANDOMIZE.  They  are  both  used  in  connection  with  random 
  239.       numbers, so you must be careful not  to get them mixed up. They 
  240.       are both  on  the  same  key  (T);  RANDOMIZE  has  had  to  be 
  241.       abbreviated to RAND.
  242.       
  243.         In some ways RND is like a function: it does calculations and 
  244.       produces a result. It is unusual  in  that  it does not need an 
  245.       argument.
  246.       
  247.         Each time you use  it,  its  result  is  a  new random number 
  248.       between 0 and 1. (Sometimes it can  take the value 0, but never 
  249.       1.)
  250.       
  251.         Try
  252.       
  253.                       10 PRINT RND
  254.                       20 GO TO 10
  255.       
  256.       to see how the answer varies.  Can  you detect any pattern7 You 
  257.       shouldn't be able to; 'random' means that there is no pattern.
  258.       
  259.         Actually, RND is not truly random, because it follows a fixed 
  260.       sequence of 65536  numbers.  However,  these  are so thoroughly 
  261.       jumbled up that there are at  least  no obvious patterns and we 
  262.       say that RND is pseudo-random.
  263.       
  264.         RND gives a random number between 0 and 1, but you can easily 
  265.       get random numbers  in  other  ranges.  For  instance, 5*RND is 
  266.       between 0 and 5, and 1.3+0.7*RND  is  between 1.3 and 2. To get 
  267.       whole numbers, use  INT  (remembering  that  INT  always rounds 
  268.       down) as in 1 +INT (RND*6), which  we shall use in a program to 
  269.       simulate dice. RND*6 is in the range 0 to 6, but since it never 
  270.       actually reach es 6, INT (RND*6) is 0,1,2,3,4 or 5.
  271.       
  272.         Here is the program:
  273.       
  274.                       10 REM dice throwing program
  275.                       20 CLS
  276.                       30 FOR n=1 TO 2
  277.                       40 PRINT 1+1NT (RND*6);" ";
  278.                       50 NEXT n
  279.                       60 INPUT a$: GO TO 20
  280.       
  281.         Press ENTER each time you want to throw the dice.
  282.       
  283.         The RANDOMIZE statement is used  to  make  RND start off at a 
  284.       definite place in its sequence of  numbers, as you can see with 
  285.       this program:
  286.       
  287.                       10 RANDOMIZE 1
  288.                       20 FOR n=1 TO 5: PRINT RND ,: NEXT n
  289.                       30 PRINT: GO TO 10
  290.       
  291.         After each execution of RANDOMIZE  1, the RND sequence starts 
  292.       off again with 0.0022735596. You  can use other numbers between 
  293.       1 and 65535  in  the  RANDOMIZE   statement  to  start  the RND 
  294.       sequence off at different places.
  295.       
  296.         If you had a program  with  RND  in  it  and it also had some 
  297.       mistakes that you had  not  found,  then  it  would help to use 
  298.       RANDOMIZE like this so that  the  program  behaved the same way 
  299.       each time you ran it.
  300.       
  301.         RANDOMIZE on its own (and RANDOMIZE 0 has the same effect) is 
  302.       different, because it really does  randomize  RND - you can see 
  303.       this in the next program.
  304.       
  305.                       10 RANDOMIZE
  306.                       20 PRINT RND: GO TO 10
  307.       
  308.         The sequence  you  get  here  is  not  very  random,  because 
  309.       RANDOMIZE uses the time  since  the  computer  was switched on. 
  310.       Since this has gone up by  the  same amount each time RANDOMIZE 
  311.       is executed, the next  RND  does  more  or  less the same.  You 
  312.       would get better randomness by replacing GO TO 10 by GO TO 20.
  313.       
  314.         Note: Most dialects of BASIC use RND and RANDOMIZE to produce 
  315.       random numbers, but not all use them in the same way.
  316.       
  317.         Here is a program  to  toss  coins  and  count the numbers of 
  318.       heads and tails.
  319.       
  320.                       10 LET heads=0: LET tails=0
  321.                       20 LET coin=lNT (RND*2)
  322.                       30 IF coin=3 THEN LET heads=heads+1
  323.                       40 IF coin=1 THEN LET tails=tails+1
  324.                       50 PRINT heads;",";tails,
  325.                       60 IF tails<>6 THEN PRINT heads/tails;
  326.                       70 PRINT: GO TO 20
  327.       
  328.         The ratio of heads to tails  should become approximately 1 if 
  329.       you go on long   enough,  because  in  the  long run you expect 
  330.       approximately equal numbers of heads and tails.
  331.       
  332.       Exercises
  333.       
  334.       1. Test this rule:
  335.         Suppose you choose a number between 1 and 872 and type
  336.       
  337.                       RANDOMIZE your number
  338.       
  339.        Then the next value of RND will be
  340.       
  341.                       (75*(your number+1) -1) /65536
  342.       
  343.       2. (For mathematicians only.)
  344.         Let p be a  (large)  prime,  and  let  a  be a primitive root 
  345.       modulo p. Then if bi is the residue of ai modulo p (l ú bi ú p- 
  346.       l ), the sequence
  347.       
  348.               bi -1
  349.                p-1
  350.       
  351.       is a cyclical sequence of p-1  distinct  numbers in the range 0 
  352.       to 1 (excluding  1). By choosing  a suitably, these can be made 
  353.       to look fairly random.
  354.       
  355.         65537 is a Fermat  prime,  2l6+1.  Because the multiplicative 
  356.       group of non-zero residues modulo 65537 has a power of 2 as its 
  357.       order, a residue is a primitive root if and only if it is not a 
  358.       quadratic residue. Use Gauss'  law  of quadratic reciprocity to 
  359.       show that 75 is a primitive root modulo 65537.
  360.       
  361.         The ZX Spectrum uses p=65537  and  a=75, and stores some bi-l 
  362.       in memory. RND entails replacing bi-1 in memory by bi+1 -1, and 
  363.       yielding  the  result  (bi+1-l)    (p-l).   RANDOMIZE  n  (with 
  364.       1únú65535) makes bi equal to n+1.
  365.       
  366.         RND is approximately uniformly  distributed  over the range 0 
  367.       to 1.
  368.       
  369.       
  370.       
  371.       CHAPTER 12
  372.       Arrays
  373.       
  374.       Summary
  375.       
  376.            Arrays (the way the ZX  Spectrum  handles string arrays is 
  377.       slightly non-standard).
  378.            DIM . . .
  379.       
  380.         Suppose you have a list of numbers, for instance the marks of 
  381.       ten people in  a class. To store them in the computer you could 
  382.       set up a single variable  for  each  person. But you would find 
  383.       them very awkward. You might decide to call the variable Bloggs 
  384.       1, Bloggs 2, and so on up to  Bloggs 10, but the program to set 
  385.       up these ten numbers would  be  rather  long and boring to type 
  386.       in.
  387.       
  388.         How much nicer it would be if you could type this:
  389.       
  390.               5 REM this program will not work
  391.               10 FOR n=1 TO 10
  392.               20 READ Bloggs n
  393.               30 NEXT n
  394.               40 DATA 10,2,5,19,16,3,11,1,0,6
  395.       
  396.         Well you can't.
  397.       
  398.         However, there is a  mechanism  by  which  you can apply this 
  399.       idea, and it uses  arrays. An array  is a set of variables, its 
  400.       elements, all with the same name  , and distinguished only by a 
  401.       number (the subscript) written in  brackets  after the name. In 
  402.       our example the name could be b (like control variables of FOR
  403.        - NEXT loops, the name of  an  array must be a single letter), 
  404.       and the ten variables would then be b(l), b(2), and so on up to 
  405.       b(l0).
  406.       
  407.         The elements of an array are called subscripted variables, as 
  408.       opposed to the simple variables  that  you are already familiar 
  409.       with.
  410.       
  411.         Before you can use an array,  you must reserve some space for 
  412.       it inside the  computer,  and  you  do  this  using  a DIM (for 
  413.       dimension) statement.
  414.       
  415.               DIM b(10)
  416.       
  417.       sets up an array called b with  dimension 10 (i.e. there are 10 
  418.       subscripted variables b(1),...,b(10))  and  initializes  the 10 
  419.       values to 0. It also  deletes  any  array called b that existed 
  420.       previously. (But not a simple  variable.  An array and a simple 
  421.       numerical variable with the same name can coexist, and there
  422.       shouldn't be  any  confusion  between  them  because  the array 
  423.       variable always has a subscript).
  424.       
  425.        The subscript can be an arbitrary numerical expression, so now 
  426.       you can write
  427.       
  428.       
  429.               10 FOR n=1 TO 10
  430.               20 READ b(n)
  431.               30 NEXT n
  432.               40 DATA 10,2,5,19,16,3,11,1,0,6
  433.       
  434.         You can also set up arrays with more than one dimension. In a 
  435.       two dimension al array you need  two  numbers to specify one of 
  436.       the elements -  rather  like  the  line  and  column numbers to 
  437.       specify a character position on  the  television screen - so it 
  438.       has the form of a table. Alternatively, if you imagine the line
  439.        and column numbers (two dimensions)  as referring to a printed 
  440.       page, you could have an  extra  dimension for the page numbers. 
  441.       Of course, we are talking about numeric arrays; so the elements 
  442.       would not be printed  characters  as  in  a  book, but numbers. 
  443.       Think of the elements of  a  three-dimensional array v as being 
  444.       specified by v (page number, line number, column number).
  445.       
  446.         For example,  to  set  up  a  two-dimensional  array  c  with 
  447.       dimensions 3 and 6, you use a DIM statement
  448.       
  449.               DIM c(3,6)
  450.       
  451.         This then gives you 3*6=18 subscripted variables
  452.       
  453.               c(1 ,1),c(1 ,2), . . .,c(1,6)
  454.               c(2, 1 ),c(2,2), . . .,c(2,6)
  455.               c(3, 1 ),c(3,2), . . .,c(3,6)
  456.       
  457.         The same principle works for any number of dimensions.
  458.       
  459.         Although you can have a  number  and  an  array with the same 
  460.       name, you cannot have two  arrays  with  the same name, even if 
  461.       they have different numbers of dimensions.
  462.       
  463.         There are also string arrays. The  strings in an array differ 
  464.       from simple strings  in  that  they  are  of  fixed  length and 
  465.       assignment to them  is  always  Procrustean  -  chopped  off or 
  466.       padded with spaces.  Another  way  of  thinking  of  them is as 
  467.       arrays (with one  extra  dimension)  of  single characters. The 
  468.       name of a string array is a  single letter followed by $, and a 
  469.       string array and a simple string  variable cannot have the same 
  470.       name (unlike the case for numbers).
  471.       
  472.         Suppose then, that you want an  array a$ of five strings. You 
  473.       must decide how long these strings  are  to be - let us suppose 
  474.       that 10 characters each is long enough. You then say
  475.       
  476.               DIM a$(5,10)            (type this in)
  477.       
  478.         This sets up a 5*10  array  of  characters,  but you can also 
  479.       think of each row  as being a string:
  480.       
  481.               a$(1)=a$(1,1) a$(1,2) . . . a$(1,10)
  482.               a$(2)=a$(2,1) a$(2,2) . . . a$(2,10)
  483.                   :            :             :                    :
  484.               a$(5)=a$(5,1) a$(5,2) . . . a$(5,10)
  485.       
  486.         If you give the same number  of subscripts (two in this case) 
  487.       as there were dimensions in the  DIM  statement, then you get a 
  488.       single character; but if you  miss  the  last one out, then you 
  489.       get a fixed length string. So, for instance, A$(2,7) is the 7th 
  490.       character in the string A$(2);  using the slicing notation,  we 
  491.       could also write this as A$(2)(7). Now type
  492.       
  493.               LET a$(2)="1234567890"
  494.            and
  495.               PRINT a$(2),a$(2,7)
  496.       
  497.         For the last subscript (the  one  you  can miss out), you can 
  498.       also have a slicer, so that for instance
  499.       
  500.               a$(2,4 TO 8)=a$(2)(4 TO 8)="45678"
  501.       
  502.         Remember:
  503.       
  504.       In a string array, all the strings have the same, fixed length. 
  505.       The DIM statement has an extra number (the last one) to specify 
  506.       this length. When you write  down  a subscripted variable for a 
  507.       string array, you can put in  an  extra number, or a slicer, to 
  508.       correspond with the extra number in  the DIM statement. You can 
  509.       have string arrays with no dimensions. Type
  510.       
  511.               DIM a$(10)
  512.       
  513.       and you will find that a$  behaves just like a string variable, 
  514.       except that it  always has length  10,  and assignment to it is 
  515.       always procrustean.
  516.       
  517.       Exercises
  518.       
  519.       1. Use READ and DATA statements to set up an array m$ of twelve 
  520.       strings in which m$(n) is the name of the nth month. (Hint: the 
  521.       DIM statement will be DIM m$(12,9). Test it by printing out all 
  522.       the mS(n) (use a loop).
  523.       
  524.        Type
  525.       
  526.               PRINT "now is the  month  of ";m$(5);"ing";" when merry 
  527.       lads are playin
  528.       g"
  529.       
  530.         What can you do about all those spaces?
  531.       
  532.       
  533.       
  534.       CHAPTER 13
  535.       Conditions
  536.       
  537.       Summary
  538.       
  539.            AND, OR
  540.            NOT
  541.       
  542.         We saw in Chapter 3 how an IF statement takes the form
  543.       
  544.                       IF condition THEN . . .
  545.       
  546.         The conditions there were the relations  (=, <, >, <=, >= and 
  547.       <>), which compare two  numbers  or  two  strings. You can also 
  548.       combine several of these,  using   the logical operations, AND, 
  549.       OR and NOT.
  550.       
  551.         One relation  AND  another  relation  is  true  whenever both 
  552.       relations are true,  so you could have a line like:
  553.       
  554.                       IF a$="yes" AND x>0 THEN PRINT x
  555.       
  556.       in which x only gets  printed  if  a$=''yes" and x>0. The BASIC 
  557.       here is  so  close   to  English  that  it  hardly  seems worth 
  558.       spelling out the:details. As in  English,  you can join lots of 
  559.       relations together with AND, and then  the whole lot is true if 
  560.       all the individual relations are.
  561.       
  562.         One relation OR another is true  whenever at least one of the 
  563.       two relations is true. (Remember that  it is still true if both 
  564.       the relations are true; this  is something that English doesn't 
  565.       always imply.)
  566.       
  567.         The NOT  relationship  turns  things  upside  down.  The  NOT 
  568.       relation is true  whenever  the  relation  is  false, and false 
  569.       whenever it is true!
  570.       
  571.         Logical expressions can be  made  with  relations and AND, OR 
  572.       and NOT,  just  as   numerical  expressions  can  be  made with 
  573.       numbers and +, - and so on;  you  can even put them in brackets 
  574.       if necessary. They have priorities in the same way as the usual 
  575.       operations +, -, *, /  and  ,  do:  OR has the lowest priority, 
  576.       then  AND,  then  NOT,  then   the  relations,  and  the  usual 
  577.       operations.
  578.       
  579.         NOT is really a function, with  an argument and a result, but 
  580.       its priority  is  much  lower  than  that  of  other functions. 
  581.       Therefore  its  argument  does  not  need  brackets  unless  it 
  582.       contains AND or OR (or both). NOT a=b means the same as
  583.        NOT (a=b) (and the same as a<>b, of course).
  584.       
  585.         <> is the negation of = in the  sense that it is true if, and 
  586.       only if, = is false. In other words,
  587.       
  588.                       a<>b is the same as NOT a=b
  589.       
  590.       and also
  591.       
  592.                       NOT a<>b is the same as a=b
  593.       
  594.         Persuade yourself that >= and <= are the negations of < and > 
  595.       respectively: thus you can always get  rid of NOT from in front 
  596.       of a relation by changing the relation.
  597.       
  598.         Also,
  599.       
  600.                       NOT (a first logical expression AND a second)
  601.       
  602.       is the same as
  603.       
  604.                       NOT (the first) OR NOT (the second)
  605.       
  606.       and
  607.       
  608.                       NOT (a first logical expression OR a second)
  609.       
  610.       is the same as
  611.       
  612.                       NOT (the first) AND NOT (the second).
  613.       
  614.         Using  this  you  can   work   NOTs  through  brackets  until 
  615.       eventually they are all  applied to relations, and then you can 
  616.       get rid  of  them.  Logically  speaking,  NOT  is  unnecessary, 
  617.       although you might still  find  that  using  it makes a program 
  618.       clearer.
  619.       
  620.         The following  section  is  quite  complicated,  and  can  be 
  621.       skipped by the faint hearted!
  622.       
  623.       Try
  624.       
  625.                       PRINT 1=2,1 < >2
  626.       
  627.       which you might expect to give a  syntax error. In fact, as far 
  628.       as the computer is  concerned,  there  is  no  such  thing as a 
  629.       logical value: instead it uses  ordinary  numbers, subject to a 
  630.       few rules.
  631.       
  632.       (i) =, <, >, <=,  >=  and  <>  all  give numeric results: 1 for 
  633.       true, and 0 for false. Thus  the  PRINT command above printed 0 
  634.       for '1=2', which is false, and 1 for '1<>2', which is true.
  635.       
  636.       (ii) In
  637.       
  638.                       IF condition THEN . . .
  639.       
  640.       the condition can be  actually  any  numeric expression. If its 
  641.       value is 0, then   it  counts  as  false,  and  any other value 
  642.       including the value of 1 that  a true relation gives) counts as 
  643.       true. Thus the IF statement means exactly the same as
  644.       
  645.                       IF condition <>0 THEN . . .
  646.       
  647.       (iii) AND, OR and NOT are also number-valued operations.
  648.       
  649.       x AND y has the value    {x if y is true (non-zero)
  650.                                {0 (false), if y is false (zero)
  651.       
  652.       x OR y has the value     {1 (true), if y is true (non zero)
  653.                                {x, if y is false (zero)
  654.       
  655.       NOT x has the value      {0 (false), if x is true (non-zero)
  656.                                {1 (true), if x is false (zero)
  657.       
  658.       
  659.       (Notice that 'true'  means  'non-zero'  when  we're  checking a 
  660.       given value, but it means '1' when we're producing a new one.)
  661.       
  662.         Read  through  the  chapter  again   in  the  light  of  this 
  663.       revelation, making sure  that it all works.
  664.       
  665.         In the expressions x AND y, x  OR  y  and NOT x, x and y will 
  666.       usually take the  values 0 and  1  for false and true. Work out 
  667.       the ten different combinations (four  for  AND, four for OR and 
  668.       two for NOT) and check that they  do what the chapter leads you 
  669.       to expect them to do.
  670.       
  671.         Try this program:
  672.       
  673.                       10 INPUT a
  674.                       20 INPUT b
  675.                       30 PRINT (a AND a>=b)+(b AND a<b)
  676.                       40 GO TO 10
  677.       
  678.        Each time it prints the  larger  of  the  two numbers a and b. 
  679.       Convince yourself  that you can think of
  680.       
  681.               x AND y
  682.       
  683.       as meaning
  684.       
  685.                       x if y (else the result is 0)
  686.       
  687.       and of
  688.       
  689.                       x OR y
  690.       
  691.       as meaning
  692.       
  693.                       x unless y (in which case the result is 1)
  694.       
  695.         An  expression  using  AND  or  OR  like  this  is  called  a 
  696.       conditional expression.  An example using OR could be
  697.       
  698.                       LET  total   price=price   less   tax*(1.15  OR 
  699.       v$="zero rated")
  700.       
  701.         Notice how AND tends to go with addition (because its default 
  702.       value is 0), and OR  tends  to  go with multiplication (because 
  703.       its default value is 1).
  704.       
  705.        You can also make  string  valued conditional expressions, but 
  706.       only using AND.
  707.       
  708.       
  709.       x$ AND y has the value  {x$ if y is non-zero
  710.                                       {"" if y is zero
  711.       
  712.       so it means x$ if y (else the empty string).
  713.       
  714.         Try this program, which inputs  two  strings and puts them in 
  715.       alphabetical order.
  716.       
  717.                10 INPUT "type in two strings"'a$,b$
  718.                20 IF a$>b$ THEN LET c$=a$: LET a$=b$: LET b$=c$
  719.                30 PRINT a$;" ";("<" AND a$<b$)+("=" AND a$=b$);" ";b$
  720.                40 GO TO 10
  721.       
  722.       Exercise
  723.       
  724.       1. BASIC can sometimes work along different lines from English. 
  725.       Consider, for  instance, the English clause 'If a doesn't equal 
  726.       b or c'. How would you write this in BASIC? The answer is not
  727.          IF A<>B OR C
  728.         nor is it
  729.          IF A<>B OR A<>C
  730.       
  731.       
  732.       
  733.       CHAPTER 14
  734.       The Character Set
  735.       
  736.       Summary
  737.       
  738.            CODE, CHR$
  739.            POKE, PEEK
  740.            USR
  741.            BIN
  742.       
  743.        The letters, digits,  punctuation  marks  and  so  on that can 
  744.       appear in strings are called  characters,  and they make up the 
  745.       alphabet, or character set, that the  ZX Spectrum uses. Most of 
  746.       these characters are single symbols,  but  there are some more, 
  747.       called tokens, that represent whole words, such as PRINT, STOP
  748.       , <> and so on.
  749.       
  750.         There are 256 characters, and each  one  has a code between 0 
  751.       and 255. There is a  complete  list  of  them in Appendix A. To 
  752.       convert between codes and characters,  there are two functions, 
  753.       CODE and CHR$.
  754.       
  755.         CODE is applied to a string, and  gives the code of the first 
  756.       character in the string (or 0 if the string is empty).
  757.       
  758.         CHR$ is applied to a  number,  and gives the single character 
  759.       string whose code is that number.
  760.       
  761.         This program prints out the entire character set:
  762.       
  763.                       10 FOR a=32 TO 255: PRINT CHRS a;: NEXT a
  764.       
  765.         At the top you can  see  a  space, 15 symbols and punctuation 
  766.       marks, the ten digits, seven more symbols, the capital letters, 
  767.       six more symbols, the lower case letters and five more symbols. 
  768.       These are all (except ú and )  taken from a  widely-used set of 
  769.       characters known  as  ASCII  (standing  for  American  Standard 
  770.       Codes for Information Interchange);  ASCII also assigns numeric 
  771.       codes to these characters, and these  are the codes that the ZX 
  772.       Spectrum uses.
  773.       
  774.         The rest of the characters  are  not  part  of ASCII, and are 
  775.       peculiar to the ZX Spectrum. First amongst them are a space and 
  776.       15 patterns of black  and  white   blobs.  These are called the 
  777.       graphics symbols and can be used  for drawing pictures. You can 
  778.       enter these from the  keyboard,  using  what is called graphics 
  779.       mode. If you press GRAPHICS (CAPS SHIFT with 9) then the cursor 
  780.       will change to
  781.        G. Now the keys for the digits  1  to 8 will give the graphics 
  782.       symbols: on their own they give  the symbols drawn on the keys; 
  783.       and with either shift  pressed  they  give  the same symbol but 
  784.       inverted, i.e. black becomes white, and vice versa.
  785.       
  786.         Regardless of shifts, digit 9  takes  you  back to normal (L) 
  787.       mode and digit 0
  788.        is DELETE.
  789.       
  790.       
  791.         After the graphics symbols, you  will  see what appears to be 
  792.       another copy of  the alphabet from A to U. These are characters 
  793.       that you can redefine  yourself.  although  when the machine is 
  794.       first switched on they are  set  as  letters  - they are called 
  795.       user-defined graphics. You can type  these in from the keyboard 
  796.       by going into graphics mode,  and  then  using the letters keys 
  797.       from A to U.
  798.       
  799.         To define a new character for  yourself, follow this recipe - 
  800.       it defines a character to show p.
  801.       
  802.       (i) Work out what the character  looks like. Each character has 
  803.       an 8x8 square of dots, each of  which can show either the paper 
  804.       colour or the ink colour  (see the introductory booklet). You'd 
  805.       draw a diagram something like this,  with black squares for the 
  806.       ink colour:
  807.       
  808.       
  809.         We've left a 1 square margin round the edge because the other 
  810.       letters all have one (except for lower case letters with tails, 
  811.       where the tail goes right down to the bottom).
  812.       
  813.       (ii) Work out which user-defined  graphic  is  to show n- let's 
  814.       say the one corresponding  to  P,  so  that  if  you press P in 
  815.       graphics mode you get p.
  816.       
  817.       (iii) Store the new pattern.  Each user-defined graphic has its 
  818.       pattern stored  as eight  numbers,  one  for  each row. You can 
  819.       write each of these numbers as  BIN  followed by eight 0's or 1 
  820.       's - 0 for paper, 1 for  ink  -  so that the eight  numbers for 
  821.       our p character are
  822.       
  823.                       BIN 00000000
  824.                       BIN 00000000
  825.                       BIN 00000010
  826.                       BIN 00111100
  827.                       BIN 01010100
  828.                       BIN 00010100
  829.                       BIN 00010100
  830.                       BIN 00000000
  831.       
  832.       (If you know about binary numbers,  then  it should help you to 
  833.       know that BIN is used to  write  a  number in binary instead of 
  834.       the usual decimal.)
  835.       
  836.         These eight numbers are  stored  in  memory, in eight places, 
  837.       each of which has an address. The address of the first byte, or 
  838.       group of eight digits, is USR   "P"  (P because that is what we 
  839.       chose in (ii)), that of the second is  USR "P" +1, and so on up 
  840.       to the eighth, which has address USR "P"+7.
  841.       
  842.         USR here is a function to  convert a string argument into the 
  843.       address of the   first  byte  in  memory  for the corresponding 
  844.       user-defined graphic. The  string  argument  must  be  a single 
  845.       character which can be  either  the user-defined graphic itself 
  846.       or the corresponding letter (in upper  or lower case). There is 
  847.       another use for USR, when its  argument is a number, which will 
  848.       be dealt with.
  849.       
  850.         Even if you don't understand this, the following program will 
  851.       do it for you
  852.       :
  853.       
  854.                       10 FOR n=0 TO 7
  855.                       20 INPUT row: POKE USR "P"+n,row
  856.                       30 NEXT n
  857.       
  858.         It will stop for INPUT data eight  times to allow you to type 
  859.       in the eight BIN numbers above -  type them in the right order, 
  860.       starting with the top row.
  861.       
  862.         The  POKE  statement  stores  a  number  directly  in  memory 
  863.       location, bypassing the mechanisms normally  used by the BASIC. 
  864.       The opposite of POKE is PEEK, and this allows us to look at the 
  865.       contents of a memory  location  although  it  does not actually 
  866.       alter the contents of that  location.  They  will be dealt with 
  867.       properly in Chapter 24.
  868.       
  869.         After the user-defined graphics come the tokens.
  870.       
  871.         You will have noticed that we  have not printed out the first 
  872.       32  characters,   with  codes  0   to  31.  These  are  control 
  873.       characters. They don't  produce  anything  printable,  but have 
  874.       some less tangible effect on  the  television, or they are used 
  875.       for controlling something other  than  the  television, and the 
  876.       television prints ? to  show  that  it doesn't understand them. 
  877.       They are described more fully in Appendix A.
  878.       
  879.         Three that the television uses are  those with codes 6, 8 and 
  880.       13; on the whole, CHR$ 8 is the only one you are likely to find 
  881.       useful.
  882.       
  883.         CHR$ 6 prints spaces in exactly the  same way as a comma does 
  884.       in a PRINT statement for instance
  885.       
  886.                       PRINT 1; CHR$ 6;2
  887.       
  888.       does the same as
  889.       
  890.                       PRINT 1,2
  891.       
  892.         Obviously this is not a very  clear  way  of using it. A more 
  893.       subtle way is to
  894.        say
  895.       
  896.                       LET a$="1"+CHR$ 6+"2"
  897.                       PRINT a$
  898.       
  899.         CHR$ 8 is 'backspace': it  moves  the print position back one 
  900.       place - try
  901.       
  902.                       PRINT "1234"; CHR$ 8;"5"
  903.       
  904.       which prints up 1235
  905.       
  906.         CHR$ 13 is 'newline': it moves  the  print position on to the 
  907.       beginning of the next line.
  908.       
  909.         The television also uses those with codes 16 to 23; these are 
  910.       explained in Chapters 15 and 16. All the control characters are 
  911.       listed in Appendix A.
  912.       
  913.         Using the codes for the characters  we can extend the concept 
  914.       of 'alphabetical  ordering'  to  cover  strings  containing any 
  915.       characters, not just letters. If   instead of thinking in terms 
  916.       of the  usual  alphabet  of  26  letters  we  use  the extended 
  917.       alphabet of 256 characters, in  the  same order as their codes, 
  918.       then the principle is  exactly  the  same.  For instance, these 
  919.       strings are in their  ZX   Spectrum alphabetical order. (Notice 
  920.       the rather odd feature that  lower  case letters come after all 
  921.       the capitals: so "a" comes after "Z"; also, spaces matter.)
  922.       
  923.                       CHR$ 3+"ZOOLOGICAL GARDENS"
  924.                       CHR$ 8+"AARDVARK HUNTING"
  925.                       "AAAARGH!"
  926.                       "(Parenthetical remark)"
  927.                       "100"
  928.                       "129.95 inc. VAT"
  929.                       "AASVOGEL"
  930.                       "Aardvark"
  931.                       "PRINT"
  932.                       "Zoo"
  933.                       "[interpolationl"
  934.                       "aardvark"
  935.                       "aasvogel"
  936.                       "zoo"
  937.                       "zoology
  938.       
  939.         Here is the rule for finding out which order two strings come 
  940.       in. First, compare the first characters. If they are different, 
  941.       then one of them has  its  code  less  than  the other, and the 
  942.       string it came from is the earlier (lesser) of the two strings. 
  943.       If  they  are  the  same,  then  go  on  to  compare  the  next 
  944.       characters. If in this  process  one  of  the  strings runs out 
  945.       before the other, then  that  string  is the earlier, otherwise 
  946.       they must be equal.
  947.       
  948.         The relations =, <, >, <=, >=  and <> are used for strings as 
  949.       well as for numbers: < means  'comes before' and > means 'comes 
  950.       after', so that
  951.       
  952.                       "AA man"<"AARDVARK"
  953.                       "AARDVARK">"AA man"
  954.       
  955.       are both true.
  956.       
  957.         <= and >= work the same way as they do for numbers, so that
  958.       
  959.                       "The same string"<="The same string"
  960.       
  961.       is true, but
  962.       
  963.               "The same string"<"The same string"
  964.       
  965.       is false.
  966.       
  967.         Experiment on all this using  the  program here, which inputs 
  968.       two strings and  puts them in order.
  969.       
  970.               10 INPUT "Type in two strings:", a$, b$
  971.               20 IF a$>b$ THEN LET c$=a$: LET a$=b$: LET b$=c$
  972.               30 PRINT a$;" ";
  973.               40 IF a$<b$ THEN PRINT "<";: GO TO 60
  974.               50 PRINT "="
  975.               60 PRINT " ";b$
  976.               70 GO TO 10
  977.       
  978.         Note how we have to introduce c$ in line 20 when we swap over 
  979.       a$ and b$,
  980.       
  981.               LET a$=b$: LET b$=a$
  982.       
  983.       would not have the desired effect.
  984.       
  985.         This program sets  up  user-defined  graphics  to  show chess 
  986.       pieces:
  987.       
  988.               P for pawn
  989.               R for rook
  990.               N for knight
  991.               B for bishop
  992.               K for king
  993.               Q for queen
  994.       
  995.         Chess pieces:
  996.       
  997.               5 LET b=BIN  01111100:  LET  c=BIN  00111000: LET d=BIN 
  998.       00010000
  999.               10 FOR n=1 TO 6: READ p$: REM 6 pieces
  1000.               20 FOR f=0 TO 7: REM read piece into 8 bytes
  1001.               30 READ a: POKE USR p$+f,a
  1002.               40 NEXT f
  1003.               50 NEXT n
  1004.               100 REM bishop
  1005.               110 DATA "b",0,d, BIN 00101000,BIN 01000100
  1006.               120 DATA BIN 01101100,c,b,0
  1007.               130 REM king
  1008.               140 DATA "k",0,d,c,d
  1009.               150 DATA c, BIN 01000100,c,0
  1010.               160 REM rook
  1011.               170 DATA "r",0, BIN 01010100,b,c
  1012.               180 DATA c,b,b,0
  1013.               190 REM queen
  1014.               200 DATA "q",0, BIN 01010100, BIN 00101000,d
  1015.               210 DATA BIN 01101100,b,b,0
  1016.               220 REM pawn
  1017.               230 DATA "p",0,0,d,c
  1018.               240 DATA c,d,b,0
  1019.               250 REM knight
  1020.               260 DATA "n",0,d,c, BIN 01111000
  1021.               270 DATA BIN 00011000,c,b,0
  1022.       
  1023.         Note that 0 can be used instead of BIN 00000000.
  1024.       
  1025.         When you have run the  program,  look  at the pieces by going 
  1026.       into graphics mode.
  1027.       
  1028.       Exercises
  1029.       
  1030.       1. Imagine the  space  for  one  symbol  divided  up  into four 
  1031.       quarters like a Battenburg cake.  Then  if  each quarter can be 
  1032.       either black or white, there are 2x2x2x2=16 possibilities. Find 
  1033.       them all in the character set.
  1034.       
  1035.       2. Run this program:
  1036.       
  1037.               10 INPUT a
  1038.               20 PRINT CHR$ a;
  1039.               30 GO TO 10
  1040.       
  1041.         If you experiment with it, you'll find that CHR$ a is rounded 
  1042.       to the nearest whole number; and if a  is not in the range 0 to 
  1043.       255 then the program stops with  error  report B integer out of 
  1044.       range.
  1045.       
  1046.       3. Which of these two is the lesser?
  1047.       
  1048.               "EVIL"
  1049.               "evil"
  1050.       
  1051.       4. Work out how to  modify  the  program to set up user-defined 
  1052.       graphics so that  it uses  READ  and DATA statements instead of 
  1053.       the INPUT statement.
  1054.       
  1055.       
  1056.       
  1057.       CHAPTER 15
  1058.       More about PRINT and INPUT
  1059.       
  1060.       Summary
  1061.       
  1062.            CLS
  1063.            PRINT items: nothing at all
  1064.            Expressions  (numeric  or   string   type):   TAB  numeric 
  1065.       expression, AT numeric
  1066.        expression, numeric expression
  1067.            PRINT separators: ,; '
  1068.            INPUT items: variables (numeric or string type)
  1069.            LINE string variable
  1070.            Any PRINT item not  beginning  with  a letter. (Tokens are 
  1071.       not considered a
  1072.       s beginning with a letter.)
  1073.            Scrolling.
  1074.            SCREEN$
  1075.       
  1076.         You have already seen PRINT  used  quite  a  lot, so you will 
  1077.       have a rough idea  of how  it is used. Expressions whose values 
  1078.       are printed are called PRINT  items,  and they are separated by 
  1079.       commas or semicolons,  which  are  called  PRINT  separators. A 
  1080.       PRINT item can also  be  nothing  at  all,  which  is  a way of 
  1081.       explaining what happens when you use two commas in a row.
  1082.       
  1083.         There are two more kinds  of  PRINT  items, which are used to 
  1084.       tell the computer not  what,  but  where  to print. For example 
  1085.       PRINT AT 11,16;"*" prints a star in the middle of the screen.
  1086.       
  1087.               AT line, column
  1088.       
  1089.       moves the PRINT position (the place  where  the next item is to 
  1090.       be printed)  to  the  line  and  column  specified.  Lines  are 
  1091.       numbered from 0 (at the top) to  21, and columns from 0 (on the 
  1092.       left) to 31.
  1093.       
  1094.         SCREEN$ is the reverse function  to  PRINT  AT, and will tell 
  1095.       you (within limits) what character  is at a particular position 
  1096.       on the screen. It uses line and  column numbers in the same way 
  1097.       as PRINT AT, but enclosed in brackets: for instance
  1098.       
  1099.               PRINT SCREEN$ (11,16)
  1100.       
  1101.       will retrieve the star you printed in the paragraph above.
  1102.       
  1103.         Characters  taken  from  tokens  print  normally,  as  single 
  1104.       characters, and spaces return as  spaces.  Lines drawn by PLOT, 
  1105.       DRAW or CIRCLE, user-defined characters and graphics characters 
  1106.       return as a null (empty)  string,  however. The same applies if 
  1107.       OVER has been used to create a composite character.
  1108.       
  1109.               TAB column
  1110.       
  1111.       prints enough spaces to move  the  PRINT position to the column 
  1112.       specified. It stays on the same line. or, if this would involve 
  1113.       backspacing, moves on to the  next  one. Note that the computer 
  1114.       reduces the column number  'modulo  32'  (it  divides by 32 and 
  1115.       takes the remainder); so TAB 33 means the same as TAB 1.
  1116.       
  1117.         As an example,
  1118.       
  1119.               PRINT TAB 30;1;TAB  12;"Contents"; AT 3,1;"CHAPTER";TAB 
  1120.       24;"page"
  1121.       
  1122.       is how you might print out  the  heading  of a contents page on 
  1123.       page 1 of a book
  1124.       .
  1125.       
  1126.         Try running this:
  1127.       
  1128.               10 FOR n=8 TO 23
  1129.               20 PRINT TAB 8*n;n;
  1130.               30 NEXT n
  1131.       
  1132.         This shows what is  meant  by  the  TAB numbers being reduced 
  1133.       modulo 32.
  1134.         For a more elegant example, change the 8 in line 20 to a 6.
  1135.         Some small points:
  1136.       
  1137.       (i) These new items are best  terminated with semicolons, as we 
  1138.       have done above. You can use commas  (or nothing, at the end of 
  1139.       the statement), but this means  that after having carefully set 
  1140.       up the PRINT position  you  immediately  move   it on again not 
  1141.       usually terribly useful.
  1142.       
  1143.       (ii) You cannot print on the  bottom  two  lines (22 and 23) on 
  1144.       the screen because they are  reserved for commands, INPUT data, 
  1145.       reports and so on. References to 'the bottom line' usually mean 
  1146.       line 21.
  1147.       
  1148.       (iii) You can use AT to put the PRINT position even where there 
  1149.       is already something printed; the old stuff will be obliterated 
  1150.       when you print more.
  1151.       
  1152.         Another statement connected with  PRINT  is  CLS. This clears 
  1153.       the whole screen , something  that  is  also  done by CLEAR and 
  1154.       RUN.
  1155.       
  1156.         When the printing reaches the bottom of the screen, it starts 
  1157.       to scroll upwards rather like a typewriter. You can see this if 
  1158.       you do
  1159.       
  1160.               CLS: FOR n=1 TO 22: PRINT n: NEXT n
  1161.       
  1162.       and then do
  1163.       
  1164.               PRINT 99
  1165.       
  1166.       a few times.
  1167.       
  1168.         If the computer is  printing  out  reams  and reams of stuff, 
  1169.       then it takes great care to  make sure that nothing is scrolled 
  1170.       off the top of the screen until  you  have had a chance to look 
  1171.       at it properly. You can see this happening if you type
  1172.       
  1173.               CLS: FOR n=1 TO 100: PRINT n: NEXT n
  1174.       
  1175.         When it has printed  a  screen  full,  it  will stop, writing 
  1176.       scroll? at the bottom of  the  screen.  You can now inspect the 
  1177.       first 22 numbers at your  leisure.  When you have finished with 
  1178.       them, press y  (for  'yes')  and  the  computer  will  give you 
  1179.       another screen full of numbers. Actually, any key will make the 
  1180.       computer carry on except n  (for  'no'), STOP (SYMBOL SHIFT and 
  1181.       a), or SPACE (the BREAK key). These will make the computer stop 
  1182.       running the program with a report  D BREAK - CONT repeats.
  1183.       
  1184.         The INPUT statement can do much more than we have told you so 
  1185.       far. You have  already seen INPUT statements like
  1186.       
  1187.               INPUT "How old are you?", age
  1188.       
  1189.       in which the computer prints  the  caption  How old are you? At 
  1190.       the bottom of the screen,  and  then  you  have to type in your 
  1191.       age.
  1192.       
  1193.         In  fact,  an  INPUT  statement  is  made  up  of  items  and 
  1194.       separators in exactly the same way  as a PRINT statement is, so 
  1195.       How old are you? and age are  both INPUT items. INPUT items are 
  1196.       generally the same as  PRINT  items,  but  there  are some very 
  1197.       important differences.
  1198.       
  1199.         First, an obvious  extra  INPUT  item  is  the variable whose 
  1200.       value you are to type in age  in our example above. The rule is 
  1201.       that if an INPUT  item  begins  with  a  letter,  it  must be a 
  1202.       variable whose value is to be input.
  1203.       
  1204.         Second, this would seem to mean  that you can't print out the 
  1205.       values of variables as part of  a caption; however, you can get 
  1206.       round  this  by  putting  brackets   round  the  variable.  Any 
  1207.       expression that  starts  with  a  letter  must  be  enclosed in 
  1208.       brackets if it is to be printed as part of a caption.
  1209.       
  1210.         Any kind of PRINT item that is not affected by these rules is 
  1211.       also an INPUT  item. Here  is  an  example to illustrate what's 
  1212.       going on:
  1213.       
  1214.               LET my age = INT (RND * 100): INPUT ("I am ";my age; ". 
  1215.       ");"How old are you?", your age
  1216.       
  1217.       my age is contained in brackets, so its value gets printed out. 
  1218.       Your age is not contained in brackets,  so you have to type its 
  1219.       value in.
  1220.       
  1221.         Everything that an INPUT statement  writes goes to the bottom 
  1222.       part of the screen,  which  acts  somewhat independently of the 
  1223.       top half. In particular, its lines are numbered relative to the 
  1224.       top line of the bottom  half,  even  if  this  has moved up the 
  1225.       actual television screen (which it  does  if  you type lots and 
  1226.       lots of INPUT data).
  1227.       
  1228.         To see how AT works in INPUT statements, try running this:
  1229.       
  1230.          10 INPUT "This is line 1.",a$;  AT 0,0;"This is line 0.",a$; 
  1231.       AT 2,0; "This is  line  2.",a$;  AT  1,0;  "This  is still line 
  1232.       1.",a$
  1233.       
  1234.       (just press ENTER each time it stops.)  When This is line 2. is 
  1235.       printed, the lower part of the screen moves up to make room for 
  1236.       it; but the numbering moves  up  as  well, so that the lines of 
  1237.       text keep their same numbers.
  1238.       
  1239.         Now try this:
  1240.       
  1241.               10 FOR n=0 TO 19: PRINT AT n,0;n;: NEXT n
  1242.               20 INPUT AT 0,0;a$; AT 1,0;a$; AT 2,0;a$; AT 3,0;a$; AT 
  1243.       4,0;a$; AT 5,0;a$;
  1244.       
  1245.         As the lower part of  the  screen  goes  up and up, the upper 
  1246.       part is undisturbed until the lower  part threatens to write on 
  1247.       the same line as the PRINT position. Then the upper part starts 
  1248.       scrolling up to avoid this.
  1249.       
  1250.         Another refinement to  the  INPUT  statement  that we haven't 
  1251.       seen yet is  called  LINE  input  and  is  a  different  way of 
  1252.       inputting string variables. If you  write  LINE before the name 
  1253.       of a string variable to be input, as in
  1254.       
  1255.               INPUT LINE a$
  1256.       
  1257.       then the computer will not give  you  the string quotes that it 
  1258.       normally does for a string  variable,  although it will pretend 
  1259.       to itself that they are there.
  1260.        So if you type in
  1261.       
  1262.               cat
  1263.       
  1264.       as the INPUT data, a$ will be  given the value cat. Because the 
  1265.       string quotes do not appear  on  the  string, you cannot delete 
  1266.       them and type in a different  sort of string expression for the 
  1267.       INPUT data. Remember  that  you  cannot  use  LINE  for numeric 
  1268.       variables.
  1269.       
  1270.         The control characters CHR$ Z and CHR$ 23 have effects rather 
  1271.       like AT and TAB.  They  are  rather  odd as control characters, 
  1272.       because whenever one is sent  to  the television to be printed, 
  1273.       it must be followed by  two  more  characters  that do not have 
  1274.       their usual effect: they are treated as numbers (their codes)to 
  1275.       specify the line and column (for  AT)  or the tab position (for 
  1276.       TAB). You will almost always find  it  easier to use AT and TAB 
  1277.       in the usual way rather  than  the control characters, but they 
  1278.       might  be  useful  in  some   circumstances.  The   AT  control 
  1279.       character is CHR$ 22.  The  first  character after it specifies 
  1280.       the line number and the second the column number, so that
  1281.       
  1282.               PRINT CHR$ 22+CHR$ 1 +CHR$ c;
  1283.       
  1284.       has exactly the same effect as
  1285.       
  1286.               PRINT AT 1,c;
  1287.       
  1288.         This is so even if CHR$  1  or  CHR$  c would normally have a 
  1289.       different meaning  (for instance if  c=13);  the CHR$ 22 before 
  1290.       them overrides that.
  1291.       
  1292.         The TAB control character is  CHR$  23 and the two characters 
  1293.       after it  are  used  to  give  a  number  between  0  and 65535 
  1294.       specifying the number you would have in a TAB item:
  1295.       
  1296.               PRINT CHRS 23+CHRS a+CHRS b;
  1297.       
  1298.       has the same effect as
  1299.       
  1300.               PRINT TAB a+256*b;
  1301.       
  1302.       You can use POKE to  stop  the  computer  asking you scroll? by 
  1303.       doing
  1304.       
  1305.               POKE 23692,255
  1306.       
  1307.       every so often. After this it  will  scroll up 255 times before 
  1308.       stopping with scroll?. As an example, try
  1309.       
  1310.               10 FOR n=0 TO 10000
  1311.               20 PRINT n: POKE 23692,255
  1312.               30 NEXT n
  1313.       
  1314.       and watch everything whizz off the screen!
  1315.       
  1316.       Exercises
  1317.       
  1318.       1.  Try  this  program   on   some   children,  to  test  their 
  1319.       multiplication tables.
  1320.       
  1321.                 10 LET m$=" "
  1322.                 20 LET a=INT (RND*12)+1: LET b=lNT (RND*12)+1
  1323.                 30 INPUT (m$) ' ' "what is ";(a) ";(b);"?";c
  1324.               100 IF c=a-b THEN LET m$="Right.": GO TO 20
  1325.               110 LET m$=''Wrong. Try again.": GO TO 30
  1326.       
  1327.         If they are perceptive, they  might  manage  to work out that 
  1328.       they do  not  have   to  do  the  calculation  themselves.  For 
  1329.       instance, if the computer asks them to  type the answer to 2*3, 
  1330.       all they have to type in is 2*3.
  1331.       
  1332.         One way of getting round this  is  to make them input strings 
  1333.       instead of numbers. Replace c in line 30 by c$. and in line 100 
  1334.       by VAL c$, and insert a line
  1335.       
  1336.       
  1337.               40 IF c$<> STR$ VAL  c$  THEN LET m$="Type it properly, 
  1338.       as a number,":
  1339.       
  1340.                      GO TO 30
  1341.       
  1342.       That will fool them. After  a  few  more  days, however, one of 
  1343.       them may discover  that they can  get round this by rubbing out 
  1344.       the string quotes and typing  in  STR$  (2*3).  To stop up this 
  1345.       loophole, you can replace c$ in line 30 by LINE c$.
  1346.       
  1347.       
  1348.       
  1349.       CHAPTER 16
  1350.       Colours
  1351.       
  1352.       Summary
  1353.       
  1354.            INK, PAPER, FLASH, BRIGHT, INVERSE, OVER
  1355.            BORDER
  1356.       
  1357.       Run this program:
  1358.       
  1359.               10 FOR m=4 TO 1: BRIGHT m
  1360.               20 FOR n=1 TO 14
  1361.               30 FOR c=4 TO 7
  1362.               40 PAPER c: PRINT " ";: REM 4 coloured spaces
  1363.               50 NEXT c: NEXT n: NEXT m
  1364.               60 FOR m=0 TO 1: BRIGHT m: PAPER 7
  1365.               70 FOR c=0 TO 3
  1366.               80 INK c: PRINT c;" ";
  1367.               90 NEXT c: PAPER 0
  1368.               100 FOR c=4 T0 7
  1369.               110 INK c: PRINT c;" ";
  1370.               120 NEXT c: NEXT m
  1371.               130 PAPER 7: INK 0: BRIGHT 0
  1372.       
  1373.       This shows the eight  colours  (including  white and black) and 
  1374.       the two levels of brightness  that  the ZX Spectrum can produce 
  1375.       on a colour  television.  (If  you  r  television  is black and 
  1376.       white, then you will just see  various shades of grey.) Here is 
  1377.       a list of them for  reference;  they  are also written over the 
  1378.       appropriate number keys.
  1379.       
  1380.               0 - black
  1381.               1 - blue
  1382.               2 - red
  1383.               3 - purple, or magenta
  1384.               4 - green
  1385.               5 - pale blue, technically called cyan
  1386.               6 - yellow
  1387.               7 - white
  1388.       
  1389.         On a black and white  television,  these numbers are in order 
  1390.       of brightness.
  1391.       
  1392.         To use these colours properly,  you  need to understand a bit 
  1393.       about how the picture is arranged.
  1394.       
  1395.         The picture is divided up into 768 (24 lines of 32) positions 
  1396.       where characters can be printed,  and each character is printed 
  1397.       as an 8x8 square of  dots  like  that  below for a. This should 
  1398.       remind you of the user-defined graphics in Chapter 14, where we 
  1399.       had 0s for the white dots and 1s for the black dots.
  1400.       
  1401.       
  1402.       
  1403.         The character  position  also  has  associated  with  it  two 
  1404.       colours: the ink, or   foreground  colour,  which is the colour 
  1405.       for the black dots in our square, and  the paper, or background 
  1406.       colour, which is used for  the  white  dots. To start off with, 
  1407.       every position has black ink and white paper so writing appears 
  1408.       as black on white.
  1409.       
  1410.         The character position also has a brightness (normal or extra 
  1411.       bright) and something  to  say  whether  it  flashes  or  not - 
  1412.       flashing is done by swapping  the  ink  and paper colours. This 
  1413.       can all be coded into numbers, so a character position then has
  1414.       
  1415.       (i) an 8x8 square of 0s  and  1  s  to  define the shape of the 
  1416.       character, with 0 for paper and 1 for ink,
  1417.       
  1418.       (ii) ink and paper colours, each  coded into a number between 0 
  1419.       and 7,
  1420.       
  1421.       (iii) a brightness - 0 for normal, 1 for extra bright and
  1422.       
  1423.       (iv) a flash number - 0 for steady, 1 for flashing.
  1424.       
  1425.       Note that  since  the  ink  and  paper  colours  cover  a whole 
  1426.       character position, you  cannot  possibly  have  more  than two 
  1427.       colours in a given block  of  64  dots.  The  same goes for the 
  1428.       brightness and flash number: they  refer to the whole character 
  1429.       position, not  individual  dots.  The  colours,  brightness and 
  1430.       flash number  at a given position are called attributes.
  1431.       
  1432.       When you print something  on  the  screen,  you  change the dot 
  1433.       pattern at that position; it  is  less obvious, but still true, 
  1434.       that you also change the attributes  at that position. To start 
  1435.       off with you do not  notice  this because everything is printed 
  1436.       with black ink on  white  paper  (and  normal brightness and no 
  1437.       flashing), but you can vary  this  with  the INK, PAPER, BRIGHT 
  1438.       and FLASH statements. Try
  1439.       
  1440.               PAPER 5
  1441.       
  1442.       and then print a  few  things:  they  will  all  appear on cyan 
  1443.       paper, because as they  are  printed  the  paper colours at the 
  1444.       positions they occupy are set to cyan (which has code 5).
  1445.       The others work the same way, so after
  1446.       
  1447.             PAPER number between 0 and 7
  1448.             INK number between 0 and 7
  1449.             BRIGHT 0 or 1                   } Think of 0 as off
  1450.         or                                  } and 1 as on
  1451.             FLASH 0 or 1                    }
  1452.       
  1453.       any printing will set  the  corresponding  attribute at all the 
  1454.       character positions it uses. Try some  of these out. You should 
  1455.       now be able to  see  how  the  program  at the beginning worked 
  1456.       (remember that a space is  a  character  that has INK and PAPER 
  1457.       the same colour).
  1458.       
  1459.         There are some more numbers  you  can use in these statements 
  1460.       that have less direct effects.
  1461.       
  1462.         8 can be used in all four statements, and means 'transparent' 
  1463.       in the sense that the old attribute shows through. Suppose, for 
  1464.       instance, that you do
  1465.       
  1466.               PAPER 8
  1467.       
  1468.         No character position will ever have  its paper colour set to 
  1469.       8 because there is no such colour;  what happens is that when a 
  1470.       position is printed on, its paper colour is left the same as it 
  1471.       was before. INK 8, BRIGHT 8 and  FLASH  8 work the same way for 
  1472.       the other attributes.
  1473.       
  1474.         9 can be used only with  PAPER and INK, and means 'contrast'. 
  1475.       The colour (ink or  paper)  that  you  use  it  with is made to 
  1476.       contrast with the other by being  made  white if the other is a 
  1477.       dark colour (black, blue,  red  or  magenta),  and black if the 
  1478.       other is a light colour (green, cyan, yellow or white).
  1479.       
  1480.         Try this by doing
  1481.       
  1482.               INK 9: FOR c=0 TO 7: PAPER c: PRINT c: NEXT c
  1483.       
  1484.         A more impressive display of its  power is to run the program 
  1485.       at the beginning to make coloured stripes, and then doing
  1486.       
  1487.               INK 9: PAPER 8: PRINT AT  0,8;:  FOR n=l TO 1080: PRINT 
  1488.       n;: NEXT n
  1489.       
  1490.         The ink colour here is always  made  to contrast with the old 
  1491.       paper colour at each position.
  1492.       
  1493.         Colour television relies on the  rather curious fact that the 
  1494.       human eye can  only  really  see  three  colours  - the primary 
  1495.       colours, blue, red and green.  The   other colours are mixtures 
  1496.       of these. For instance, magenta  is  made  by mixing  blue with 
  1497.       red - which is why its  code,  3,  is  the sum of the codes for 
  1498.       blue and red.
  1499.       
  1500.         To see how  all  eight  colours  fit  together, imagine three 
  1501.       rectangular spotlights, coloured blue,  red  and green, shining 
  1502.       at not quite the same place  on  a  piece of white paper in the 
  1503.       dark. Where they overlap you will  see mixtures of  colours, as 
  1504.       shown by this program  (note  that  ink  spaces are obtained by 
  1505.       using either SHIFT with 8 when in G mode):
  1506.       
  1507.               10 BORDER 0: PAPER 0: INK 7: CLS
  1508.               20 FOR a=1 TO 6
  1509.               30 PRINT TAB 6; INK 1; "nnnnnnnnnnnnnnnnnn": REM 18 ink 
  1510.       squares
  1511.               40 NEXT a
  1512.